SQL s klauzulou MAX

Otázka od: Peter Vlkovic

31. 10. 2002 15:19

Ahoj,

riesim problem selectu s klauzulou MAX.
Mam dve tabulky. Tabulku osoba a archiv.
Tabulka archiv obsahuje k jednej osobe
spravidla viacero zaznamov, mna vsak
zaujima zaznam s poslednym datumom.
Nasledovny select funguje spravne:

select
  osoba.MENO,
  osoba.PRIEZ,
  ( select max(DATUM) from archiv where ID=osoba.ID )
  ...

Z tabulky archiv vsak potrebujem okrem hodnoty
DATUM aj inu polozku (napr. OPERATOR), co sa mi
vsak nedari, hoci som uz skusal vsetko mozne,
co ma napadlo (napr. rozne konstrukcie LEFT JOIN-u).

Nevedel by mi niekto pomoct? Ide o databazu INFORMIX.

Vlkovic

Odpovedá: tomsir1.edu@mail.cez.cz

31. 10. 2002 14:36


 ... a co pouzit SELECT max(DATUM) as max_datum, OPERATOR FROM archiv
WHERE ....

Radek





Peter Vlkovic <vlkovic@minv.sk>@clexpert.cz on 31.10.2002 14:08:35

Odpovězte prosím - delphi-l@clexpert.cz

Odesláno kým: delphi-l-owner@clexpert.cz


Komu: delphi-l@clexpert.cz
Kopie:
Předmět: SQL s klauzulou MAX


Ahoj,

riesim problem selectu s klauzulou MAX.
Mam dve tabulky. Tabulku osoba a archiv.
Tabulka archiv obsahuje k jednej osobe
spravidla viacero zaznamov, mna vsak
zaujima zaznam s poslednym datumom.
Nasledovny select funguje spravne:

select
  osoba.MENO,
  osoba.PRIEZ,
  ( select max(DATUM) from archiv where ID=osoba.ID )
  ...

Z tabulky archiv vsak potrebujem okrem hodnoty
DATUM aj inu polozku (napr. OPERATOR), co sa mi
vsak nedari, hoci som uz skusal vsetko mozne,
co ma napadlo (napr. rozne konstrukcie LEFT JOIN-u).

Nevedel by mi niekto pomoct? Ide o databazu INFORMIX.

Vlkovic


Odpovedá: Lstiburek Pavel

31. 10. 2002 15:51

napr. takto:

SELECT Osoba.*, xArchiv.*
   FROM Osoba LEFT OUTER JOIN (
        SELECT ID, Datum, OPERATOR, ...
           FROM archiv
           WHERE Datum = (SELECT Max( Datum)
                              FROM Archiv arch
                              WHERE arch.ID = archiv.Id)
           ) xArchiv ON Osoba.ID = xArchiv.ID

Podminkou je, ze datum v tabulce archiv je pro osobu jejinecne !

Pavel

> Od: Peter Vlkovic [mailto:vlkovic@minv.sk]

> riesim problem selectu s klauzulou MAX.
> Mam dve tabulky. Tabulku osoba a archiv.
> Tabulka archiv obsahuje k jednej osobe
> spravidla viacero zaznamov, mna vsak
> zaujima zaznam s poslednym datumom.
> Nasledovny select funguje spravne:
>
> select
> osoba.MENO,
> osoba.PRIEZ,
> ( select max(DATUM) from archiv where ID=osoba.ID )
> ...
>
> Z tabulky archiv vsak potrebujem okrem hodnoty
> DATUM aj inu polozku (napr. OPERATOR), co sa mi
> vsak nedari, hoci som uz skusal vsetko mozne,
> co ma napadlo (napr. rozne konstrukcie LEFT JOIN-u).
>
> Nevedel by mi niekto pomoct? Ide o databazu INFORMIX.

Odpovedá: Peter Vlkovic

31. 10. 2002 17:12

> ... a co pouzit SELECT max(DATUM) as max_datum, OPERATOR FROM archiv
> WHERE ....
> Radek


Vysledok vnoreneho selectu nemoze byt viac nez jeden stlpec.
Takze i nadalej ostavam v koncoch.

Vlkovic


> Mam dve tabulky. Tabulku osoba a archiv.
> Tabulka archiv obsahuje k jednej osobe
> spravidla viacero zaznamov, mna vsak
> zaujima zaznam s poslednym datumom.
> Nasledovny select funguje spravne:
>
> select
> osoba.MENO,
> osoba.PRIEZ,
> ( select max(DATUM) from archiv where archiv.ID=osoba.ID )
> ...
>
> Z tabulky archiv vsak potrebujem okrem hodnoty
> DATUM aj inu polozku (napr. OPERATOR)...

Odpovedá: Peter Vlkovic

31. 10. 2002 18:06

> napr. takto:
>
> SELECT Osoba.*, xArchiv.*
> FROM Osoba LEFT OUTER JOIN (
> SELECT ID, Datum, OPERATOR, ...
> FROM archiv
> WHERE Datum = (SELECT Max( Datum)
> FROM Archiv arch
> WHERE arch.ID = archiv.Id)
> ) xArchiv ON Osoba.ID = xArchiv.ID
>
> Podminkou je, ze datum v tabulce archiv je pro osobu jejinecne !
>
> Pavel

Tvoj select je naozaj prespekulovany. Lenze Informix mi
takyto zapis nechce zozrat. Vyhadzuje syntakticku chybu
v druhom selecte (vo fraze join).

[Nehovoriac o tom, ze v ramci tabulky archiv moze rovnakych
datumov existovat viacero].

Ale aj tak - vdaka za snahu.

Vlkovic


> > Mam dve tabulky. Tabulku osoba a archiv.
> > Tabulka archiv obsahuje k jednej osobe
> > spravidla viacero zaznamov, mna vsak
> > zaujima zaznam s poslednym datumom.
> > Nasledovny select funguje spravne:
> >
> > select
> > osoba.MENO,
> > osoba.PRIEZ,
> > ( select max(DATUM) from archiv where ID=osoba.ID )
> > ...
> >
> > Z tabulky archiv vsak potrebujem okrem hodnoty
> > DATUM aj inu polozku (napr. OPERATOR)...

Odpovedá: Lstiburek Pavel

1. 11. 2002 8:36

Abych jen tak nepovidal, zde je priklad:
----------------------------------------
select
  osoba.*,
  ( select max(DATUM) from archiv where ID=osoba.ID ) Datum,
  ( select TOP 1 Operator FROM archiv
            where ID = osoba.Id
            order by Datum desc) Operator
  FROM OSOBA

Upozornuji pouze, ze pokud datum neni v tabulce archiv pro ID jedinecne, tak
to co ziskas je neco podobneho spatnemu generatoru nahodnych cisel. V SQL
serverech neplati, ze pri trideni zaznamu se jako pomocny klic pouziva jeste
poradi zaznamu v tabulce (jako ve flat databazich napr. DBASE, Paradox,
...)!
Aplikaci by asi prospelo trochu analyzy, nejjednodusi by bylo (i kdyz ne moc
analyticke), doplnit do tabulky dalsi sloupec typu IDENTITY a ten pouzit
jako druhy klic pro trideni : " order by datum, PORADIVZNIKU "

>
> [Nehovoriac o tom, ze v ramci tabulky archiv moze rovnakych
> datumov existovat viacero].
>